/**
 * \file
 */

#ifndef EDGE_H
#define EDGE_H

#include "node.h"
#include <stdbool.h>
/* Sin esto da errores de compilacion*/
#include <stdlib.h>

/*! @file edge.h
 *  @brief < Estructura y funciones de las aristas >
 */

typedef struct s_edge *edge;

/*! @fn edge_create(node nd, unsigned int capacity, unsigned int flow, 
                   bool backward)
 *  @brief Crea una nueva arista.
 *  @pre <code> (nd != NULL) </code>
 *  @return una arista edge.
 */
edge edge_create(node nd, unsigned int capacity, unsigned int flow, 
                   bool backward);

/*! @fn edge_get_capacity(edge e)
 *  @brief Getter del atributo capacity de la arista
 *  @param e : La arista interesada
 *  @pre <code> (e != NULL) </code>
 *  @return entero que representa la capacidad.
 */
unsigned int edge_get_capacity(edge e);

/*! @fn edge_get_flow(edge e)
 *  @brief Getter del atributo flow de la arista
 *  @param e : La arista interesada
 *  @pre <code> (e != NULL) </code>
 *  @return entero que representa el flujo.
 */
unsigned int edge_get_flow(edge e);

/*! @fn edge_get_backward(edge e)
 *  @brief Getter del atributo backward de la arista
 *  @param e : La arista interesada
 *  @pre <code> (e != NULL) </code>
 *  @return booleano que indica el estado del atributo.
 */
bool edge_get_backward(edge e);


/*! @fn edge_to(edge e)
 *  @brief Getter del atributo nd de la arista
 *  @param e : La arista interesada
 *  @pre <code> (e != NULL) </code>
 *  @return el nodo.
 */
node edge_to(edge e);


/*! @fn edge_destroy(edge e)
 *  @brief Destructor de una instancia de arista
 *  @param e : La arista interesada
 *  @pre <code> (e != NULL) </code>
 *  @return  NULL
 */
edge edge_destroy(edge e);


/*! @fn edge_set_capacity(edge e, unsigned int capacity)
 *  @brief Setter del atributo capacity de la arista
 *  @pre <code> (e != NULL) </code>
 *  @param e : La arista interesada
 */
void edge_set_capacity(edge e, unsigned int capacity);

/*! @fn edge_set_flow(edge e, unsigned int flow)
 *  @brief Setter del atributo flow de la arista
 *  @param e : La arista interesada
 *  @pre <code> (e != NULL) </code>
 */
void edge_set_flow(edge e, unsigned int flow);


/*! @fn edge_set_backward(edge e, bool status)
 *  @brief Setter del atributo backward de la arista
 *  @param e : La arista interesada
 *  @pre <code> (e != NULL) </code>
 */
void edge_set_backward(edge e, bool status );


/*! @fn edge_find_node_forw(node x, node y)
 *  @brief Obtiene una arista entre x e y (forward)
 *  @param x : nodo origen de la busqueda de arista
 *  @param y : nodo destino de la busqueda de arista
 *  @pre <code> (x != NULL) </code>
 *  @pre <code> (y != NULL) </code>
 *  @return La arista
 */
edge edge_find_node_forw(node x, node y);

/*! @fn edge_find_node_back(node x, node y)
 *  @brief Obtiene una arista entre x e y (backward)
 *  @param x : nodo origen de la busqueda de arista
 *  @param y : nodo destino de la busqueda de arista
 *  @pre <code> (x != NULL) </code>
 *  @pre <code> (y != NULL) </code>
 *  @return La arista
 */
edge edge_find_node_back(node x, node y);


#endif
